package modelrsa

import (
	"crypto/rand"
	"crypto/rsa"
	"crypto/x509"
	"encoding/base64"
	"encoding/pem"
	"golang.org/x/crypto/bcrypt"
)

var (
	PRIVATE_KEY_PATH = "PRIVATEKEY.pem"
	PUBLIC_KEY_PATH  = "PUBLICKEY.pem"
	PRIVATE_KEY      []byte
	PUBLIC_KEY       []byte
)

// 生成密匙

// func SetUp() {

// 	// 生成 RSA 密钥对
// 	privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
// 	if err != nil {
// 		fmt.Printf("生成 RSA 密钥对失败: %v", err)
// 	}
// 	// 将私钥转换为 ASN.1 PKCS#1 DER 编码
// 	privDER := x509.MarshalPKCS1PrivateKey(privateKey)
// 	// 将 DER 编码的私钥转换为 PEM 格式
// 	privPEM := pem.EncodeToMemory(&pem.Block{
// 		Type:  "RSA PRIVATE KEY",
// 		Bytes: privDER,
// 	})
// 	// 将公钥提取为 *rsa.PublicKey 类型
// 	publicKey := &privateKey.PublicKey
// 	// 将公钥转换为 ASN.1 PKIX DER 编码
// 	pubDER, err := x509.MarshalPKIXPublicKey(publicKey)
// 	if err != nil {
// 		fmt.Printf("公钥编码失败: %v", err)
// 	}
// 	// 将 DER 编码的公钥转换为 PEM 格式
// 	pubPEM := pem.EncodeToMemory(&pem.Block{
// 		Type:  "RSA PUBLIC KEY",
// 		Bytes: pubDER,
// 	})
// 	utils.SaveFile(PRIVATE_KEY_PATH, privPEM)
// 	utils.SaveFile(PUBLIC_KEY_PATH, pubPEM)
// }

func SetUp(pr []byte, pu []byte) {
	//_, file, _, ok := runtime.Caller(0)
	//if !ok {
	//	fmt.Println("无法获取当前文件路径")
	//	return
	//}
	//
	//// 获取当前文件的目录
	//dir := filepath.Dir(file)
	////fmt.Println("当前文件所在的目录路径:", dir)
	//pr := utils.ReadFile(dir + "/" + PRIVATE_KEY_PATH)
	//pu := utils.ReadFile(dir + "/" + PUBLIC_KEY_PATH)
	PRIVATE_KEY = pr
	PUBLIC_KEY = pu
}

// Decrypt 解密
func Decrypt(s string) (string, error) {
	b, err := base64.StdEncoding.DecodeString(s)
	if err != nil {
		return "", err
	}
	pr := []byte(PRIVATE_KEY)
	prBlock, _ := pem.Decode(pr)
	priK, err := x509.ParsePKCS1PrivateKey(prBlock.Bytes)
	if err != nil {
		return "", err
	}
	res, err := rsa.DecryptPKCS1v15(rand.Reader, priK, b)
	if err != nil {
		return "", err
	}
	return string(res), nil
}

// HashPassword 哈希密码
func HashPassword(password string) (string, error) {
	hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	if err != nil {
		return "", err
	}
	return string(hashedPassword), nil
}

// CheckPasswordHash 检查密码和哈希值是否匹配
func CheckPasswordHash(password, hashedPassword string) bool {
	err := bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(password))
	return err == nil
}
